"""
服务端程序
数据存储类
"""
import pandas as pd
import pymysql
from pymongo import MongoClient


# Excel存储类
class DoubanExcelPipeLine:
    def __init__(self, file_path: str):
        """
        初始化
        :param file_path:保存的文件地址
        """

        # 创建一个writer文件写入对象 数据写入文件
        self.writer = pd.ExcelWriter(file_path)
        self.data = []

    def process_item(self, item):
        """
        数据处理  将豆瓣数据对象存入到self.data中
        :param item:豆瓣数据对象
        :return:
        """
        self.data.append({
            '详情地址': item.detail_url,
            '标题': item.titles,
            '导演和演员': item.name,
            '类型': item.classes,
            '评分': item.rating_num,
            '评价人数': item.appraise_num,
            '简介': item.quote,
            '图片地址': item.img_src,
        })
        return item

    def close_spider(self):
        """
        爬虫结束后将数据写入到Excel文件中 并且关闭文件
        :return:
        """
        df = pd.DataFrame(self.data)
        df.to_excel(self.writer, index=False)
        self.writer.close()


class DoubanMysqlPipeline:
    def __init__(self):
        """
        初始化
        连接mysql服务
        """
        self.connection = pymysql.Connect(
            host='127.0.0.1',
            port=3308,
            user='admin',
            database='reptile18_study',
            password='qwe123',
            charset='utf8mb4'
        )  # MySQL连接对象
        self.cursor = self.connection.cursor()  # 游标对象

    def process_item(self, item):
        """
        数据处理  将数据存储到数据库中
        :param item:每部电影信息对象
        :return:
        """
        self.cursor.execute(
            'INSERT INTO `douban_movie` VALUES (%s,%s,%s,%s,%s,%s,%s)',
            (
                item.titles,
                item.name,
                item.classes,
                item.rating_num,
                item.appraise_num,
                item.quote,
                item.img_src,
            )
        )
        self.connection.commit()
        return item

    def close_spider(self):
        """
        结束程序，持久化，资源释放
        关闭释放游标对象
        关闭数据库连接
        :return:
        """
        self.cursor.close()
        self.connection.close()


class DoubanMongoPipeline:
    def __init__(self):
        """
        初始化
        连接Mongo服务
        """
        self.connection = MongoClient(host='127.0.0.1', port = 27017)
        self.db = self.connection['reptile_study']  #选择数据库
        self.collection = self.db['douban_movie']   #选择集合   相当于选择表

    def process_item(self, item):
        """
        数据处理  将数据存储到数据库中
        :param item:每部电影信息对象
        :return:
        """
        # 往集合里面插入数据  item是个对象 但是insert_one插入的应该是个字典  item.__dict__将对象转成字典
        self.collection.insert_one(item.__dict__)
        return item

    def close_spider(self):
        """
        结束程序，持久化，资源释放
        关闭释放游标对象
        关闭数据库连接
        :return:
        """
        self.connection.close()     #释放连接对象
